home *** CD-ROM | disk | FTP | other *** search
/ Disc to the Future 2 / Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin / MAC / THINKC / 3_0 / JOVE_4 / JOVESOUR / GETCH.C < prev    next >
Text File  |  1988-05-07  |  2KB  |  135 lines

  1. /***************************************************************************
  2.  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
  3.  * is provided to you without charge, and with no warranty.  You may give  *
  4.  * away copies of JOVE, including sources, provided that this notice is    *
  5.  * included in all the files.                                              *
  6.  ***************************************************************************/
  7.  
  8. #include "tune.h"
  9.  
  10. #ifdef MSDOS
  11.  
  12. #include <bios.h>
  13. #include <dos.h>
  14.  
  15. #include "jove.h"
  16.  
  17. #ifdef LINT_ARGS
  18. private void waitfun(void);
  19. #else
  20. private void waitfun();
  21. #endif
  22.  
  23. extern int UpdModLine;
  24. #ifdef IBMPC
  25. static char last = 0;
  26. extern int specialkey;
  27. #endif
  28.  
  29. getrawinchar()
  30. {
  31. #ifdef RAINBOW
  32.     union REGS regs;
  33. #endif /* RAINBOW */
  34. #ifdef IBMPC
  35.     unsigned scan;
  36.     
  37.     if (specialkey = last) {
  38.         scan = last;
  39.         last = 0;
  40.         return scan;
  41.     }
  42. #endif /* IBMPC */
  43.  
  44.     while (!rawkey_ready())
  45.         waitfun();
  46.  
  47. #ifdef IBMPC
  48.     scan = _bios_keybrd(_KEYBRD_READ);
  49.     if ((scan&0xff) == 0) {
  50.         last = (char) (scan >> 8);
  51.         return 0xff;
  52.     }
  53.     return scan&0xff;
  54. #else /* IBMPC */
  55. #ifdef RAINBOW
  56. waitloop:
  57.     regs.x.di = 2;
  58.     int86(0x18, ®s, ®s);
  59.     if (regs.h.al != 0)    /* should never happen, but who knows */
  60.         return regs.h.al;
  61.     else
  62.         goto waitloop;
  63. #else /* RAINBOW */
  64.     return bdos(0x06, 0x00ff, 0xff) & 0xff;
  65. #endif /* RAINBOW */
  66. #endif /* IBMPC */
  67. }
  68.  
  69. static int waiting = 0;
  70.  
  71. rawkey_ready()
  72. {
  73. #ifndef IBMPC
  74.     union REGS regs;
  75. #endif
  76.  
  77.     if (waiting)
  78.         return 0;
  79. #ifdef IBMPC
  80.     if (last) 
  81.         return 1;
  82.  
  83.     return _bios_keybrd(_KEYBRD_READY);
  84. #else /* IBMPC */
  85. #ifdef RAINBOW
  86.     regs.x.di = 4;
  87.     int86(0x18, ®s, ®s);
  88.     return regs.h.cl != 0;
  89. #else /* RAINBOW */
  90.     regs.h.ah = 0x44;        /* ioctl call */
  91.     regs.x.bx = 0;            /* stdin file handle */
  92.     regs.h.al = 0x06;        /* get input status */
  93.     intdos(®s, ®s);
  94.     return regs.h.al & 1;
  95. #endif /* RAINBOW */
  96. #endif /* IBMPC */
  97. }
  98.  
  99. #ifdef IBMPC
  100. static long timecount, lastcount = 0;
  101. #else
  102. static char lastmin = 0;
  103. #endif
  104.  
  105.  
  106. private void
  107. waitfun()
  108. {
  109. #ifndef IBMPC
  110.     struct dostime_t tc;
  111. #endif
  112.  
  113.     if (UpdModLine) {
  114.         waiting = 1;
  115.         redisplay();
  116.         waiting = 0;
  117.         return;
  118.     }
  119. #ifdef IBMPC
  120.     if (_bios_timeofday(_TIME_GETCLOCK, &timecount) ||  /* after midnight */
  121.             (timecount > lastcount + 0x444) ) {
  122.         lastcount = timecount;
  123.         UpdModLine = 1;
  124.     }
  125. #else
  126.     _dos_gettime(&tc);
  127.     if (tc.minute != lastmin) {
  128.         UpdModLine = 1;
  129.         lastmin = tc.minute;
  130.     }
  131. #endif
  132. }
  133.  
  134. #endif /* MSDOS */
  135.